package extreme.fizzbuzz;

/**
 * 题目背景
 * 你是一名体育老师，在某次课距离下课还有五分钟时，你决定搞一个游戏。此时有N名学生在上 课。游戏的规则是:
 * 1.	让所有学生排成一队，然后按顺序报数。
 * 2.	学生报数时，如果所报数字是3的倍数，那么不能说该数字，而要说Fizz;如果所报数字是5 的倍数，那么要说Buzz;如果所报数字是第7的倍数，那么要说Whizz。
 * 3.	学生报数时，如果所报数字同时是两个特殊数的倍数情况下，也要特殊处理，比如3和5的 倍数，那么不能说该数字，而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数， 那么要说FizzBuzzWhizz。
 * 4.	学生报数时，如果所报数字包含了3，那么也不能说该数字，而是要说相应的单词，比如要 报13的同学应该说Fizz。
 * 5.	如果数字中包含了3，那么忽略规则2和规则3，比如要报30的同学只报Fizz，不报FizzBuzz 。
 */
public class Test {

    public static final String FIZZ_3 = "Fizz";
    public static final String BUZZ_5 = "Buzz";
    public static final String Whizz_7 = "Whizz";

    /**
     * 3的倍数 Fizz，5的倍数Buzz  7的倍数Whizz
     * 3和5的倍数FizzBuzz 、3和7的倍数FizzWhizz、 5和7的倍数BuzzWhizz、3，5和7的倍数FizzBuzzWhizz
     * 包含3（13）Fizz
     */
    public static void main(String[] args) {
        printOut(1);
    }

    public static void printOut(int num) {
        if (num < 1 || num > 100) {
            throw new IllegalArgumentException("数字要在1-100之间");
        }
        // 3的倍数
        boolean is3 = threeMultiple(num);
        // 5的倍数
        boolean is5 = fiveMultiple(num);
        // 7的倍数
        boolean is7 = sevenMultiple(num);
        StringBuilder res = new StringBuilder();
        if (String.valueOf(num).contains("3")) {
            res.append(FIZZ_3);
        } else {
            if (is3) {
                res.append(FIZZ_3);
            }
            if (is5) {
                res.append(BUZZ_5);
            }
            if (is7) {
                res.append(Whizz_7);
            }
            if (!is3 && !is5 && !is7) {
                res.append(num);

            }
        }
        System.out.println(res);
    }

    /**
     * 3的倍数 输出 Fizz
     *
     * @param num
     * @return
     */
    private static boolean threeMultiple(int num) {
        return num % 3 == 0 ? true : false;
    }

    /**
     * 5的倍数输出Buzz
     *
     * @param num
     * @return
     */
    private static boolean fiveMultiple(int num) {
        return num % 5 == 0 ? true : false;
    }

    /**
     * 7的倍数 输出 FizzBuzz
     *
     * @param num
     * @return
     */
    private static boolean sevenMultiple(int num) {
        return num % 7 == 0 ? true : false;
    }
}